package com.engine.common.util.GeoUtil;

import com.engine.common.baseEntity.gis.BoxRangeEntity;

import java.util.ArrayList;
import java.util.List;

import static java.lang.Math.pow;
import static java.lang.Math.round;

/**
 * @author FY
 * @version 1.0.0
 * @ClassName GeomCaculateUtil.java
 * @Description TODO
 * @createTime 2021年10月22日
 */
public class GeomCaculateUtil {

    final static int ZMAXLIMIT=20;
    final static int ZMINLIMIT=6;

    public static int[] LngLatToTileNum(int z,double lng,double lat)
    {
        double x=lng,y=lat;
        double max = 20037508.34;
        double res = (max*2)/(pow(2,z));
        double xmin=x-x%res;
        int XX=(int)(round((xmin+max)/res));
        double ymin=y-y%res;
        int YY=(int)(round((max-ymin-res)/res));
        return new int[]{XX, YY};
    }

    public static List<String> LngLatRangeToTileNumListString(int zmin, int zmax, BoxRangeEntity boxRangeEntity)
    {
        List<String> stringList=new ArrayList<>();
        if(zmax>ZMAXLIMIT)
            zmax=ZMAXLIMIT;
        if(zmin<ZMINLIMIT)
            zmin=ZMINLIMIT;
        for (int i = zmin; i < zmax+1; i++) {
           int[] min=GeomCaculateUtil.LngLatToTileNum(i,boxRangeEntity.getMinX(),boxRangeEntity.getMinY());
           int[] max=GeomCaculateUtil.LngLatToTileNum(i,boxRangeEntity.getMaxX(),boxRangeEntity.getMaxY());
           if(min[0]>max[0])
           {
               int m=max[0];
               max[0]=min[0];
               min[0]=m;
           }
            if(min[1]>max[1])
            {
                int m=max[1];
                max[1]=min[1];
                min[1]=m;
            }
            for (int j = min[0]; j < max[0]+1; j++) {
                String str2=i+":"+j+":";
                for (int k = min[1]; k < max[1]+1; k++) {
                    String str3=str2+k;
                    stringList.add(str3);
                }
            }
        }
        return  stringList;
    }

    public static List<String> LngLatRangeToTileNumListStringWithPac(int zmin, int zmax,String pac, BoxRangeEntity boxRangeEntity)
    {
        String p="";
        List<String> stringList = new ArrayList<>();
        for(int h=2;h<pac.length();h++) {
            p = pac.substring(0, h);
            if (zmax > ZMAXLIMIT)
                zmax = ZMAXLIMIT;
            if (zmin < ZMINLIMIT)
                zmin = ZMINLIMIT;
            for (int i = zmin; i < zmax + 1; i++) {
                int[] min = GeomCaculateUtil.LngLatToTileNum(i, boxRangeEntity.getMinX(), boxRangeEntity.getMinY());
                int[] max = GeomCaculateUtil.LngLatToTileNum(i, boxRangeEntity.getMaxX(), boxRangeEntity.getMaxY());
                if (min[0] > max[0]) {
                    int m = max[0];
                    max[0] = min[0];
                    min[0] = m;
                }
                if (min[1] > max[1]) {
                    int m = max[1];
                    max[1] = min[1];
                    min[1] = m;
                }
                String str1=p+":";
                for (int j = min[0]; j < max[0] + 1; j++) {
                    String str2 =str1 + i + ":" + j + ":";
                    for (int k = min[1]; k < max[1] + 1; k++) {
                        String str3 = str2 + k;
                        stringList.add(str3);
                    }
                }
            }
        }
        return  stringList;
    }
}
